﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dominio;
using Log4Net;

namespace HotelGUI
{
    public partial class ABMHabitaciones : Form
    {
        ISistema sistema =  Dominio.Fabrica.getSistema();
        String LlenarCamposObligatorios = "Debe llenar todos los datos.";
        ILog log = FactoryLogs.getLogInstance();


        public ABMHabitaciones()
        {
            InitializeComponent();
            
        }

        private void limpiarForm()
        {
            mtHabitacion.Clear();
            cmbCapacidad.SelectedIndex = 0;
            cmbCategoria.SelectedIndex = 0;
            cbEstado.Checked = false;
            if (pbFoto.Image != null)
            {
                pbFoto.Image.Dispose();
                pbFoto.Image = null;
                pbFoto.ImageLocation = "";
            }
            while (clbComodidades.CheckedItems.Count > 0)
            {
                object itemChecked = clbComodidades.CheckedItems[0];
                clbComodidades.SetItemCheckState(clbComodidades.Items.IndexOf(itemChecked), CheckState.Unchecked);
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
             if (mtHabitacion.Text != "")
            {
                int n = -10;
                try
                {
                    float cost = float.Parse(mtCosto.Text.Trim());
                    String cat = cmbCategoria.SelectedItem.ToString();
                    String cap = cmbCapacidad.SelectedItem.ToString();

                    List<String> comodList = new List<String>();
                    List<int> idComodList = new List<int>();

                    // Creo una lista con las comodidades seleccionadas.
                    foreach (object item in clbComodidades.CheckedItems)
                    {
                        comodList.Add(clbComodidades.GetItemText(item));
                        string[] m = item.ToString().Split('-');
                        idComodList.Add(int.Parse(m[0]));
                    }

                    char estado='S';
                    if (cbEstado.Checked)
                        estado='N';

                    mtHabitacion.Text = sistema.altaHabitacion(int.Parse(mtHabitacion.Text.Trim()), cap, cat,idComodList,estado).ToString();

                    n = dgvHabitaciones.Rows.Add();
                    
                    dgvHabitaciones.Rows[n].Cells["Comodidades"].Value = comodList;
                    String tip = "Comodidades: ";
                    foreach (String s in comodList)
                    {
                        tip = tip + "\n\t- " + s;
                    }

                    dgvHabitaciones.Rows[n].Cells["numero"].Value = mtHabitacion.Text.Trim();
                    dgvHabitaciones.Rows[n].Cells["Categoria"].Value = cmbCategoria.SelectedItem.ToString();
                    dgvHabitaciones.Rows[n].Cells["Capacidad"].Value = cmbCapacidad.SelectedItem.ToString();
                    dgvHabitaciones.Rows[n].Cells["Costo"].Value = mtCosto.Text.Trim();
                    dgvHabitaciones.Rows[n].Cells["Imagen"].Value = pbFoto.ImageLocation;
                    dgvHabitaciones.Rows[n].Cells["Activa"].Value = estado.ToString();

                    // Seteo a todas las celdas el mismo tooltiptext

                    foreach (DataGridViewCell celda in dgvHabitaciones.Rows[n].Cells)
                    {
                        celda.ToolTipText = tip;
                    }
                    
                    dgvHabitaciones.Refresh();
                    log.info(sistema.obtenerIdUsuarioLogueado(), "Creacion de nueva Habitacion: " + mtHabitacion.Text.Trim());
                    limpiarForm();
                }catch(Exception ex)
                {
                        MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    try
                    {
                        dgvHabitaciones.Rows.RemoveAt(n);
                    }
                    catch (Exception ex2)
                    {
                        MessageBox.Show(this, ex2.Message, "Error", MessageBoxButtons.OK,MessageBoxIcon.Error);
                    }
                }
            }
            else
                MessageBox.Show(this, LlenarCamposObligatorios, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
            
        }

        private void btnImagen_Click(object sender, EventArgs e)
        {
            if (pbFoto.Image != null)
            {
                pbFoto.Image.Dispose();
                pbFoto.Image = null;
            }
            try
            {
                ofdFoto.ShowDialog(this);
                pbFoto.ImageLocation = ofdFoto.FileName.ToString();
                pbFoto.Load();
            }
            catch (InvalidOperationException ioe)
            {
                MessageBox.Show(this, ioe.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            if (mtHabitacion.Text != "" && mtCosto.Text != "" && cmbCapacidad.SelectedIndex >= 0)
            {
                try
                {
                    int numFila = 0;
                    String cat = cmbCategoria.SelectedItem.ToString();
                    String cap = cmbCapacidad.SelectedItem.ToString();
                    char estado = 'S';
                    while (dgvHabitaciones.RowCount > numFila && mtHabitacion.Text.Trim() != dgvHabitaciones.Rows[numFila].Cells["numero"].Value.ToString())
                    {
                        numFila++;
                    }
                    if (numFila != dgvHabitaciones.RowCount)
                    {

                        dgvHabitaciones.Rows[numFila].Cells["numero"].Value = mtHabitacion.Text.Trim();
                        dgvHabitaciones.Rows[numFila].Cells["Categoria"].Value = cmbCategoria.SelectedItem.ToString();
                        dgvHabitaciones.Rows[numFila].Cells["Capacidad"].Value = cmbCapacidad.SelectedItem.ToString();
                        dgvHabitaciones.Rows[numFila].Cells["Costo"].Value = mtCosto.Text.Trim();
                        dgvHabitaciones.Rows[numFila].Cells["Imagen"].Value = pbFoto.ImageLocation;                       
                        if (cbEstado.Checked)
                            estado = 'N';
                        dgvHabitaciones.Rows[numFila].Cells["Activa"].Value = estado;

                        List<String> comodList = new List<String>();
                        List<int> idComodList = new List<int>();

                        // Creo una lista con las comodidades seleccionadas.
                        foreach (object item in clbComodidades.CheckedItems)
                        {
                            comodList.Add(clbComodidades.GetItemText(item));
                            string[] m = item.ToString().Split('-');
                            idComodList.Add(int.Parse(m[0]));
                        }
                        dgvHabitaciones.Rows[numFila].Cells["Comodidades"].Value = comodList;
                        String tip = "Comodidades: ";
                        foreach (String s in comodList)
                        {
                            tip = tip + "\n\t- " + s;
                        }
                        // Seteo a todas las celdas el mismo tooltiptext

                        foreach (DataGridViewCell celda in dgvHabitaciones.Rows[numFila].Cells)
                        {
                            celda.ToolTipText = tip;
                        }

                        sistema.modificarHabitacion(int.Parse(mtHabitacion.Text.Trim()), cap, cat, idComodList, estado);
                        btnAgregar.Enabled = true;
                        btnModificar.Enabled = false;
                        dgvHabitaciones.Refresh();
                        log.info(sistema.obtenerIdUsuarioLogueado(), "Modificacion de Habitacion: " + mtHabitacion.Text.Trim());
                        limpiarForm();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
                MessageBox.Show(this, LlenarCamposObligatorios, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void dgvHabitaciones_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            List<String> comodList;
            if (e.RowIndex == -1)
            {
                return;
            }
            mtHabitacion.Text = dgvHabitaciones.Rows[e.RowIndex].Cells["numero"].Value.ToString();
            mtCosto.Text = dgvHabitaciones.Rows[e.RowIndex].Cells["Costo"].Value.ToString();
            cmbCategoria.SelectedIndex = cmbCategoria.Items.IndexOf(dgvHabitaciones.Rows[e.RowIndex].Cells["Categoria"].Value.ToString());
            cmbCapacidad.SelectedIndex = cmbCapacidad.Items.IndexOf(dgvHabitaciones.Rows[e.RowIndex].Cells["Capacidad"].Value.ToString());
            if (dgvHabitaciones.Rows[e.RowIndex].Cells["Imagen"].Value != null)
            {
                pbFoto.ImageLocation = dgvHabitaciones.Rows[e.RowIndex].Cells["Imagen"].Value.ToString();
                pbFoto.Load();
            }
            if (dgvHabitaciones.Rows[e.RowIndex].Cells["Activa"].Value.ToString() == "N")
                cbEstado.Checked = true;
            else
                cbEstado.Checked = false;

            comodList = (List<String>)dgvHabitaciones.Rows[e.RowIndex].Cells["Comodidades"].Value;
            
            // Recorro la lista de Comodidades seleccionadas y las activo
            if (comodList.Count > 1)
            foreach (String item in comodList)
            {
                clbComodidades.SetItemCheckState(clbComodidades.Items.IndexOf(item), CheckState.Checked);
            }
            btnAgregar.Enabled = false;
            btnModificar.Enabled = true;
        }

        private void ABMHabitaciones_Load(object sender, EventArgs e)
        {
            btnAgregar.Enabled = true;
            btnModificar.Enabled = false;
            
            // Esto es asi, hardcodeado
            cmbCapacidad.Items.Add("Simple");
            cmbCapacidad.Items.Add("Doble");
            cmbCapacidad.Items.Add("Triple");

            cmbCapacidad.SelectedIndex = 0;
            
            List<String[]> lstCategorias = sistema.traerCategorias(true);
            foreach (string[] l in lstCategorias)
            {
                cmbCategoria.Items.Add(l[1]);
            }
            cmbCategoria.SelectedIndex = 0;

            List<String[]> lstcom = sistema.traerComodidades(true);
            foreach (string[] l in lstcom)
            {
                clbComodidades.Items.Add(l[0] + "-" + l[2]);
            }

            List<String[]> lsthab = sistema.traerHabitaciones(false);
            foreach (String[] hab in lsthab)
            {
                int n = -10;
                try
                {
                    n = dgvHabitaciones.Rows.Add();
                    dgvHabitaciones.Rows[n].Cells["Numero"].Value = hab[0];
                    dgvHabitaciones.Rows[n].Cells["Capacidad"].Value = hab[1];
                    dgvHabitaciones.Rows[n].Cells["Categoria"].Value = hab[2];
                    dgvHabitaciones.Rows[n].Cells["Activa"].Value = hab[3];

                    List<string[]> comodidadesBD = sistema.obtenerComodidadesHabitacion(int.Parse(hab[0]));
                    List<String> comodHab = new List<String>();
                    foreach (string[] comod in comodidadesBD)
                    {
                        string comodida = comod[0]+"-"+comod[1];
                        comodHab.Add(comodida);
                    }

                    dgvHabitaciones.Rows[n].Cells["Costo"].Value = actualizarCosto(hab[2],hab[1]).ToString();
                    
                    dgvHabitaciones.Rows[n].Cells["Comodidades"].Value = comodHab;
                    String tip = "Comodidades: ";
                    foreach (String s in comodHab)
                    {
                        tip = tip + "\n\t- " + s;
                    }
                    foreach (DataGridViewCell celda in dgvHabitaciones.Rows[n].Cells)
                    {
                        celda.ToolTipText = tip;
                    }

                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, "Error Cargando las Categorias. " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    if (n >= 0)
                        try
                        {
                            dgvHabitaciones.Rows.RemoveAt(n);
                        }
                        catch (Exception ex1)
                        {
                            MessageBox.Show(this, ex1.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            limpiarForm();
            btnAgregar.Enabled = true;
            btnModificar.Enabled = false;
        }

        private void cmbCategoria_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbCapacidad.SelectedItem != null && cmbCategoria.SelectedItem != null)
                mtCosto.Text=actualizarCosto(cmbCategoria.SelectedItem.ToString(), cmbCapacidad.SelectedItem.ToString()).ToString();
        }

        private void cmbCapacidad_SelectedIndexChanged(object sender, EventArgs e)
        {
            
            if (cmbCapacidad.SelectedItem != null && cmbCategoria.SelectedItem != null)
                mtCosto.Text = actualizarCosto(cmbCategoria.SelectedItem.ToString(), cmbCapacidad.SelectedItem.ToString()).ToString();
        }

        private float actualizarCosto(string categoria, string capacidad)
        {
            try
            {

                List<String[]> lstCategorias = sistema.traerCategorias(true);
                int numCat = 0;
                foreach (string[] l in lstCategorias)
                {
                    if (l[1] == categoria)
                        numCat = int.Parse(l[0]);
                }
                return sistema.obtenerCostoHabitacion(numCat, capacidad);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        

    }
}
